/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PainelCacaPalavras.java
 *
 * Created on May 31, 2011, 3:01:42 PM
 */
package cataletra.gui;

import cataletra.db.DB;
import cataletra.main.Main;
import cataletra.main.CacaPalavras;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
import java.util.Arrays;

/**
 *
 * @author arthur
 */
public class PainelCacaPalavras extends javax.swing.JPanel {
    
    private MouseAdapter evento;
    //esta é uma matriz de 2x2, que representa as coordenadas da primeira letra da palavra (x=0)
    //e da última letra da palavra (x=1)
    private int[][] coords;
    
    BotaoCataLetra[][] botoes;
    
    Color oldColor;
    int oldStyle;
    int oldSize;
    
    int contadorPalavras;
    boolean[] palavrasAchadas;
    
    CacaPalavras cacaPalavras;
    
    ArrayList palavras;
    
    int qtdeLinhas;
    int qtdeColunas;
    int qtdePalavras;
    
    private DB db;
    
    /** Creates new form PainelCacaPalavras */
    public PainelCacaPalavras(ArrayList palavras, int linhas, int colunas, int qtdePalavras) {
        initComponents();
        
        this.palavras = palavras;
        this.qtdeLinhas = linhas;
        this.qtdeColunas = colunas;
        this.qtdePalavras = qtdePalavras;
        
        this.reiniciar();
    }
    
    public PainelCacaPalavras() {
        initComponents();
        int linhas = 10;
        int colunas = 10;
        this.db = new DB();
        Object[] p = db.getPalavras("TODOS");
        ArrayList words = new ArrayList();
        words.addAll(Arrays.asList(p));
        
        this.palavras = words;
        this.qtdeLinhas = linhas;
        this.qtdeColunas = colunas;
        this.qtdePalavras = 10;
        
        this.reiniciar();
    }
    
    public void proximoNivel(){
        this.qtdeLinhas += 2;
        this.qtdeColunas += 3;
        this.qtdePalavras += 2;
        
        Object[] p = db.getPalavras("TODOS");
        ArrayList words = new ArrayList();
        words.addAll(Arrays.asList(p));
        
        JanelaPrincipal jp = Main.getJanelaPrincipal();
        Dimension d = new Dimension(jp.getWidth() + 50, jp.getHeight() + 30);
        jp.setSize(d);
        
        this.palavras = words;
        
        this.reiniciar();
    }
    
    public final void reiniciar(){
        this.removeAll();
        this.setLayout(new java.awt.GridLayout(qtdeLinhas, qtdeColunas));
        
        evento = new java.awt.event.MouseAdapter() {
                    @Override
                    public void mousePressed(java.awt.event.MouseEvent evt) {
                        String[] coord = evt.getComponent().getName().split("-");
                        clique(Integer.parseInt(coord[0]), Integer.parseInt(coord[1]));
                    }
                };
        
        coords = new int[2][2];
        this.reiniciarCoordenadas();
        
        cacaPalavras = new CacaPalavras(palavras, qtdeLinhas, qtdeColunas, qtdePalavras);
        contadorPalavras = 0;
        palavrasAchadas = new boolean[qtdePalavras];
        botoes = new BotaoCataLetra[cacaPalavras.getLinhas()][cacaPalavras.getColunas()];

        for(int i = 0; i < cacaPalavras.getLinhas(); i++){
            for(int j = 0; j < cacaPalavras.getColunas(); j++){
                botoes[i][j] = new BotaoCataLetra();
                botoes[i][j].setMargin(new java.awt.Insets(-1,-1,-1,-1));
                botoes[i][j].setPreferredSize(new Dimension(30, 30));
                configurarFonte(botoes[i][j], Color.black, Font.PLAIN, 12);
                botoes[i][j].setText(cacaPalavras.getLetra(i, j));
                botoes[i][j].setName(i + "-" + j);
                botoes[i][j].addMouseListener(evento);
                this.add(botoes[i][j]);
            }
            this.updateUI();
        }
    }
    
    
    private void configurarFonte(java.awt.Component c, Color cor, int estilo, int tamanhoFonte){
        c.setForeground(cor);
        c.setFont(new Font("Tahoma", estilo, tamanhoFonte));
    }
    
    
    private void clique(int x, int y){
        addCoordenada(x, y);
        boolean achou = false;
        boolean palavraNuncaFoiAchada = true;  
        
        //se esse clique for a primeira letra da palavra
        if(coords[1][0] == -1){
            oldColor = botoes[x][y].getForeground();
            oldStyle = botoes[x][y].getFont().getStyle();
            oldSize = botoes[x][y].getFont().getSize();
        }
        
        configurarFonte(botoes[coords[0][0]][coords[0][1]], Color.red, Font.BOLD, 14);

        //se esse clique for a ultima letra da palavra
        if(coords[1][0] != -1){
            if(coords[0][0] == coords[1][0] && coords[0][1] == coords[1][1]){
                configurarFonte(botoes[coords[0][0]][coords[0][1]], oldColor, oldStyle, oldSize);
                reiniciarCoordenadas();
                return;
            }
            
            int posicao = CacaPalavras.getPosicao(coords[0], coords[1]);
            
            if(posicao != CacaPalavras.INDEFINIDO){
                String palavra = cacaPalavras.getPalavra(posicao, coords[0], coords[1]);
                

                for(int i = 0; i < cacaPalavras.getQtdePalavras(); i++){
                    if(palavra.equals(cacaPalavras.getPalavrasUsadas()[i].toUpperCase())) {
                        palavraNuncaFoiAchada = !palavrasAchadas[i];
                        if(palavraNuncaFoiAchada){
                            palavrasAchadas[i] = true;
                            Main.getJanelaPrincipal().getPainelLateral().riscar(palavra);
                            achou = true;
                            contadorPalavras++;
                            destacarPalavra(coords[0][0], coords[0][1], posicao, palavra.length(), Color.black);

                            if(contadorPalavras == cacaPalavras.getQtdePalavras()){
                                Main.getJanelaPrincipal().ganhou();
                            }
                        }
                        break;
                    }
                }
            }

            if(!achou && palavraNuncaFoiAchada){
                Main.getJanelaPrincipal().punir(10);
                configurarFonte(botoes[coords[0][0]][coords[0][1]], oldColor, oldStyle, oldSize);
            }

            reiniciarCoordenadas();
        }
    }
    
    
    private void addCoordenada(int x, int y){
        if(coords[0][0] == -1){
            coords[0][0] = x;
            coords[0][1] = y;
        } else {
            coords[1][0] = x;
            coords[1][1] = y;
        }
    }
    
    
    private void reiniciarCoordenadas(){
        coords[0][0] = -1;
        coords[0][1] = -1;
        coords[1][0] = -1;
        coords[1][1] = -1;
    }
    
    
    private void destacarPalavra(int x, int y, int pos, int tam, Color corRisco) {
        int m = CacaPalavras.getM(pos);
        int n = CacaPalavras.getN(pos);

        for(int i = 0; i < tam; i++){
            int w = x + i * m;
            int z = y + i * n;
            botoes[w][z].riscar(pos);
            botoes[w][z].setCor(corRisco);
            configurarFonte(botoes[x + i * m][y + i * n], Color.black, Font.BOLD, 14);
        }
    }
    

    public void mostrarResposta(){
        for(int i = 0; i < cacaPalavras.getQtdePalavras(); i++){
            if(!palavrasAchadas[i]){
                int[] pos = cacaPalavras.acharPalavra(cacaPalavras.getPalavrasUsadas()[i].toUpperCase());
                destacarPalavra(pos[0], pos[1], pos[2], cacaPalavras.getPalavrasUsadas()[i].length(), Color.red);
            }                
        }
    }
    

    public CacaPalavras getCacaPalavras() {
        return cacaPalavras;
    }
    

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setLayout(new java.awt.GridLayout(5, 5));
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
